#include "Socket.hpp"
#include "TcpServer.hpp"
#include "Protocol.hpp"
#include "Cal.hpp"
#include "Common.hpp"
#include "Daemon.hpp"
#include <iostream>
#include <memory>

using namespace SocketModule;

// ./tcpserver port
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << " port" << std::endl;
        exit(USAGE_ERR);
    }
    uint16_t port = std::stoi(argv[1]);
    InetAddr addr(port);

    Daemon(1, 0);

    Enable_File_log_Strategy();
    // 1.创建计算器对象
    Cal cal;

    // 2.创建协议对象
    std::shared_ptr<Protocol> proc = std::make_shared<Protocol>(
        [&cal](const Request &req)
        {
            return cal.Calculate(req);
        });

    // 3.创建server对象，注册对应的服务方法（由protocol协议提供）
    std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(
        addr, [proc](std::shared_ptr<Socket> sock, const InetAddr &addr)
        { proc->GetRequest(sock, addr); });

    tsvr->Start();

    return 0;
}